package com.bank.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.dto.CardOpenRequest;
import com.bank.dto.Result;
import com.bank.entity.CardInfo;
import com.bank.entity.CustomerCardView;
import com.bank.entity.DepositType;
import com.bank.entity.TradeDetailView;
import com.bank.entity.TradeInfo;
import com.bank.entity.UserInfo;
import com.bank.service.CardInfoService;
import com.bank.service.DepositTypeService;
import com.bank.service.TradeInfoService;
import com.bank.service.UserInfoService;
import com.bank.service.ViewService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 管理员控制器
 * 处理管理员相关的所有功能请求
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
@Slf4j
@Controller
@RequestMapping("/admin")
@Validated
public class AdminController {

    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private DepositTypeService depositTypeService;

    @Autowired
    private CardInfoService cardInfoService;

    @Autowired
    private TradeInfoService tradeInfoService;

    @Autowired
    private ViewService viewService;

    /**
     * 管理员首页
     * 
     * @param model 模型
     * @return 首页视图
     */
    @GetMapping({"", "/", "/index"})
    public String index(Model model) {
        try {
            // 获取统计信息
            Result<Integer> customerCountResult = userInfoService.getCustomerCount();
            Result<Integer> depositTypeCountResult = depositTypeService.getDepositTypeCount();
            Result<Object> cardStatisticsResult = cardInfoService.getCardStatistics();
            Result<Map<String, Object>> tradeStatisticsResult = tradeInfoService.getTradeStatistics();

            model.addAttribute("customerCount", customerCountResult.getData());
            model.addAttribute("depositTypeCount", depositTypeCountResult.getData());
            model.addAttribute("cardStatistics", cardStatisticsResult.getData());
            model.addAttribute("tradeStatistics", tradeStatisticsResult.getData());

            return "admin/index";
        } catch (Exception e) {
            log.error("加载管理员首页异常：", e);
            model.addAttribute("error", "加载首页数据失败：" + e.getMessage());
            return "admin/index";
        }
    }

    // ================================
    // 客户信息管理（10分）
    // ================================

    /**
     * 客户信息管理页面
     * 
     * @param model 模型
     * @return 客户管理视图
     */
    @GetMapping("/customers")
    public String customers(Model model) {
        return "admin/customers";
    }

    /**
     * 分页查询客户信息
     * 
     * @param current 当前页
     * @param size 页大小
     * @param customerName 客户姓名（可选）
     * @param pid 身份证号（可选）
     * @param telephone 联系电话（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 分页结果
     */
    @GetMapping("/customers/page")
    @ResponseBody
    public Result<IPage<UserInfo>> getCustomersPage(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size,
            @RequestParam(required = false) String customerName,
            @RequestParam(required = false) String pid,
            @RequestParam(required = false) String telephone,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime) {
        
        Page<UserInfo> page = new Page<>(current, size);
        return userInfoService.getCustomersPage(page, customerName, pid, telephone, startTime, endTime);
    }

    /**
     * 新增客户信息
     * 
     * @param userInfo 客户信息
     * @return 操作结果
     */
    @PostMapping("/customers")
    @ResponseBody
    public Result<UserInfo> addCustomer(@Valid @RequestBody UserInfo userInfo) {
        return userInfoService.addCustomer(userInfo);
    }

    /**
     * 修改客户信息
     * 
     * @param userInfo 客户信息
     * @return 操作结果
     */
    @PutMapping("/customers")
    @ResponseBody
    public Result<UserInfo> updateCustomer(@Valid @RequestBody UserInfo userInfo) {
        return userInfoService.updateCustomer(userInfo);
    }

    /**
     * 删除客户信息
     * 
     * @param customerId 客户ID
     * @return 操作结果
     */
    @DeleteMapping("/customers/{customerId}")
    @ResponseBody
    public Result<String> deleteCustomer(@PathVariable @NotNull Integer customerId) {
        return userInfoService.deleteCustomer(customerId);
    }

    /**
     * 批量删除客户信息
     * 
     * @param customerIds 客户ID列表
     * @return 操作结果
     */
    @DeleteMapping("/customers/batch")
    @ResponseBody
    public Result<String> batchDeleteCustomers(@RequestBody List<Integer> customerIds) {
        return userInfoService.batchDeleteCustomers(customerIds);
    }

    /**
     * 根据客户ID查询客户信息
     * 
     * @param customerId 客户ID
     * @return 客户信息
     */
    @GetMapping("/customers/{customerId}")
    @ResponseBody
    public Result<UserInfo> getCustomerById(@PathVariable @NotNull Integer customerId) {
        return userInfoService.getCustomerById(customerId);
    }

    /**
     * 导出客户信息到CSV
     * 
     * @return CSV文件
     */
    @GetMapping("/customers/export")
    public ResponseEntity<String> exportCustomers() {
        Result<String> result = userInfoService.exportCustomersToCSV();
        if (result.isSuccess()) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=customers.csv")
                    .contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
                    .body(result.getData());
        } else {
            return ResponseEntity.badRequest().body("导出失败：" + result.getMessage());
        }
    }

    // ================================
    // 存款业务信息管理（10分）
    // ================================

    /**
     * 存款类型管理页面
     * 
     * @param model 模型
     * @return 存款类型管理视图
     */
    @GetMapping("/deposit-types")
    public String depositTypes(Model model) {
        return "admin/deposit-types";
    }

    /**
     * 分页查询存款类型信息
     * 
     * @param current 当前页
     * @param size 页大小
     * @param savingName 存款名称（可选）
     * @param description 存款描述（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 分页结果
     */
    @GetMapping("/deposit-types/page")
    @ResponseBody
    public Result<IPage<DepositType>> getDepositTypesPage(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size,
            @RequestParam(required = false) String savingName,
            @RequestParam(required = false) String description,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime) {
        
        Page<DepositType> page = new Page<>(current, size);
        return depositTypeService.getDepositTypesPage(page, savingName, description, startTime, endTime);
    }

    /**
     * 获取所有可用的存款类型（用于下拉选择）
     * 
     * @return 存款类型列表
     */
    @GetMapping("/deposit-types/all")
    @ResponseBody
    public Result<List<DepositType>> getAllDepositTypes() {
        return depositTypeService.getAllAvailableDepositTypes();
    }

    /**
     * 新增存款类型
     * 
     * @param depositType 存款类型信息
     * @return 操作结果
     */
    @PostMapping("/deposit-types")
    @ResponseBody
    public Result<DepositType> addDepositType(@Valid @RequestBody DepositType depositType) {
        return depositTypeService.addDepositType(depositType);
    }

    /**
     * 修改存款类型
     * 
     * @param depositType 存款类型信息
     * @return 操作结果
     */
    @PutMapping("/deposit-types")
    @ResponseBody
    public Result<DepositType> updateDepositType(@Valid @RequestBody DepositType depositType) {
        return depositTypeService.updateDepositType(depositType);
    }

    /**
     * 删除存款类型
     * 
     * @param savingId 存款类型ID
     * @return 操作结果
     */
    @DeleteMapping("/deposit-types/{savingId}")
    @ResponseBody
    public Result<String> deleteDepositType(@PathVariable @NotNull Integer savingId) {
        return depositTypeService.deleteDepositType(savingId);
    }

    /**
     * 根据存款类型ID查询存款类型信息
     * 
     * @param savingId 存款类型ID
     * @return 存款类型信息
     */
    @GetMapping("/deposit-types/{savingId}")
    @ResponseBody
    public Result<DepositType> getDepositTypeById(@PathVariable @NotNull Integer savingId) {
        return depositTypeService.getDepositTypeById(savingId);
    }

    /**
     * 导出存款类型信息到CSV
     *
     * @return CSV文件
     */
    @GetMapping("/deposit-types/export")
    public ResponseEntity<String> exportDepositTypes() {
        Result<String> result = depositTypeService.exportDepositTypesToCSV();
        if (result.isSuccess()) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=deposit-types.csv")
                    .contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
                    .body(result.getData());
        } else {
            return ResponseEntity.badRequest().body("导出失败：" + result.getMessage());
        }
    }

    // ================================
    // 银行卡信息管理（10分）
    // ================================

    /**
     * 银行卡管理页面
     *
     * @param model 模型
     * @return 银行卡管理视图
     */
    @GetMapping("/cards")
    public String cards(Model model) {
        return "admin/cards";
    }

    /**
     * 分页查询银行卡信息
     *
     * @param current 当前页
     * @param size 页大小
     * @param cardId 卡号（可选）
     * @param customerName 客户姓名（可选）
     * @param savingId 存款类型ID（可选）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return 分页结果
     */
    @GetMapping("/cards/page")
    @ResponseBody
    public Result<IPage<CardInfo>> getCardsPage(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size,
            @RequestParam(required = false) String cardId,
            @RequestParam(required = false) String customerName,
            @RequestParam(required = false) Integer savingId,
            @RequestParam(required = false) Boolean isReportLoss,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
            @RequestParam(required = false) BigDecimal minBalance,
            @RequestParam(required = false) BigDecimal maxBalance) {

        Page<CardInfo> page = new Page<>(current, size);
        return cardInfoService.getCardsPage(page, cardId, customerName, savingId, isReportLoss,
                startDate, endDate, minBalance, maxBalance);
    }

    /**
     * 新增银行卡（开户）
     *
     * @param request 开户请求信息
     * @return 操作结果
     */
    @PostMapping("/cards")
    @ResponseBody
    public Result<CardInfo> addCard(@RequestBody @Valid CardOpenRequest request) {
        // 将DTO转换为实体
        CardInfo cardInfo = new CardInfo();
        cardInfo.setCardId(request.getCardId());
        cardInfo.setCustomerId(request.getCustomerId());
        cardInfo.setSavingId(request.getSavingId());
        cardInfo.setCurId(request.getCurId());
        cardInfo.setOpenMoney(request.getOpenMoney());
        cardInfo.setPassword(request.getPassword());

        return cardInfoService.addCard(cardInfo);
    }

    /**
     * 修改银行卡信息
     *
     * @param cardInfo 银行卡信息
     * @return 操作结果
     */
    @PutMapping("/cards")
    @ResponseBody
    public Result<CardInfo> updateCard(@Valid @RequestBody CardInfo cardInfo) {
        return cardInfoService.updateCard(cardInfo);
    }

    /**
     * 删除银行卡（销户）
     *
     * @param cardId 卡号
     * @return 操作结果
     */
    @DeleteMapping("/cards/{cardId}")
    @ResponseBody
    public Result<String> deleteCard(@PathVariable @NotNull String cardId) {
        return cardInfoService.deleteCard(cardId);
    }

    /**
     * 销户取款（一次性取出所有余额并销户）
     *
     * @param cardId 卡号
     * @param password 密码
     * @param remark 备注
     * @return 操作结果
     */
    @PostMapping("/cards/{cardId}/close-account-withdraw")
    @ResponseBody
    public Result<BigDecimal> closeAccountWithdraw(
            @PathVariable @NotNull String cardId,
            @RequestParam @NotBlank(message = "密码不能为空") String password,
            @RequestParam(required = false) String remark) {
        return cardInfoService.closeAccountWithdraw(cardId, password, remark);
    }

    /**
     * 根据卡号查询银行卡详细信息
     *
     * @param cardId 卡号
     * @return 银行卡详细信息
     */
    @GetMapping("/cards/{cardId}")
    @ResponseBody
    public Result<CardInfo> getCardById(@PathVariable @NotNull String cardId) {
        return cardInfoService.getCardDetailById(cardId);
    }

    /**
     * 生成新的银行卡号
     *
     * @return 新的银行卡号
     */
    @GetMapping("/cards/generate-card-id")
    @ResponseBody
    public Result<String> generateNewCardId() {
        return cardInfoService.generateNewCardId();
    }

    /**
     * 导出银行卡信息到CSV
     *
     * @return CSV文件
     */
    @GetMapping("/cards/export")
    public ResponseEntity<String> exportCards() {
        Result<String> result = cardInfoService.exportCardsToCSV();
        if (result.isSuccess()) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=cards.csv")
                    .contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
                    .body(result.getData());
        } else {
            return ResponseEntity.badRequest().body("导出失败：" + result.getMessage());
        }
    }

    // ================================
    // 交易信息管理（查询功能）
    // ================================

    /**
     * 交易管理页面
     *
     * @param model 模型
     * @return 交易管理视图
     */
    @GetMapping("/trades")
    public String trades(Model model) {
        return "admin/trades";
    }

    /**
     * 分页查询交易记录
     *
     * @param current 当前页
     * @param size 页大小
     * @param cardId 卡号（可选）
     * @param customerName 客户姓名（可选）
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return 分页结果
     */
    @GetMapping("/trades/page")
    @ResponseBody
    public Result<IPage<TradeInfo>> getTradesPage(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size,
            @RequestParam(required = false) String cardId,
            @RequestParam(required = false) String customerName,
            @RequestParam(required = false) String tradeType,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime,
            @RequestParam(required = false) BigDecimal minAmount,
            @RequestParam(required = false) BigDecimal maxAmount) {

        Page<TradeInfo> page = new Page<>(current, size);
        return tradeInfoService.getTradesPage(page, cardId, customerName, tradeType,
                startTime, endTime, minAmount, maxAmount);
    }

    /**
     * 删除交易记录
     *
     * @param tradeId 交易ID
     * @return 操作结果
     */
    @DeleteMapping("/trades/{tradeId}")
    @ResponseBody
    public Result<String> deleteTrade(@PathVariable @NotNull Integer tradeId) {
        return tradeInfoService.deleteTrade(tradeId);
    }

    /**
     * 根据交易ID查询交易信息
     *
     * @param tradeId 交易ID
     * @return 交易信息
     */
    @GetMapping("/trades/{tradeId}")
    @ResponseBody
    public Result<TradeInfo> getTradeById(@PathVariable @NotNull Integer tradeId) {
        return tradeInfoService.getTradeById(tradeId);
    }

    /**
     * 导出交易记录到CSV
     *
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return CSV文件
     */
    @GetMapping("/trades/export")
    public ResponseEntity<String> exportTrades(
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime) {

        Result<String> result = tradeInfoService.exportTradesToCSV(startTime, endTime);
        if (result.isSuccess()) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=trades.csv")
                    .contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
                    .body(result.getData());
        } else {
            return ResponseEntity.badRequest().body("导出失败：" + result.getMessage());
        }
    }

    /**
     * 导出交易统计报表到CSV
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return CSV文件
     */
    @GetMapping("/trades/export-statistics")
    public ResponseEntity<String> exportTradeStatistics(
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime) {

        Result<String> result = tradeInfoService.exportTradeStatisticsToCSV(startTime, endTime);
        if (result.isSuccess()) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=trade-statistics.csv")
                    .contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
                    .body(result.getData());
        } else {
            return ResponseEntity.badRequest().body("导出失败：" + result.getMessage());
        }
    }

    /**
     * 获取交易统计信息
     *
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 统计信息
     */
    @GetMapping("/trades/statistics")
    @ResponseBody
    public Result<List<Map<String, Object>>> getTradeStatistics(
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime) {

        if (startTime != null && endTime != null) {
            return tradeInfoService.getTradeStatisticsByTimeRange(startTime, endTime);
        } else {
            Result<Map<String, Object>> result = tradeInfoService.getTradeStatistics();
            return result.isSuccess() ?
                    Result.success(Collections.singletonList(result.getData())) :
                    Result.error("获取统计信息失败");
        }
    }

    // ================================
    // 视图查询功能（高级功能）
    // ================================

    /**
     * 客户银行卡视图查询页面
     *
     * @param model 模型
     * @return 客户银行卡视图页面
     */
    @GetMapping("/views/customer-cards")
    public String customerCardsView(Model model) {
        return "admin/views/customer-cards";
    }

    /**
     * 分页查询客户银行卡视图数据
     *
     * @param current 当前页
     * @param size 页大小
     * @param customerName 客户姓名（可选）
     * @param savingName 存款类型（可选）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return 分页结果
     */
    @GetMapping("/views/customer-cards/page")
    @ResponseBody
    public Result<IPage<CustomerCardView>> getCustomerCardsViewPage(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size,
            @RequestParam(required = false) String customerName,
            @RequestParam(required = false) String savingName,
            @RequestParam(required = false) String isReportLoss,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
            @RequestParam(required = false) BigDecimal minBalance,
            @RequestParam(required = false) BigDecimal maxBalance) {

        Page<CustomerCardView> page = new Page<>(current, size);
        return viewService.getCustomerCardsPage(page, customerName, savingName, isReportLoss,
                startDate, endDate, minBalance, maxBalance);
    }

    /**
     * 导出客户银行卡视图数据到CSV
     *
     * @param customerName 客户姓名（可选）
     * @param savingName 存款类型（可选）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return CSV文件
     */
    @GetMapping("/views/customer-cards/export")
    public ResponseEntity<String> exportCustomerCardsView(
            @RequestParam(required = false) String customerName,
            @RequestParam(required = false) String savingName,
            @RequestParam(required = false) String isReportLoss,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
            @RequestParam(required = false) BigDecimal minBalance,
            @RequestParam(required = false) BigDecimal maxBalance) {

        Result<String> result = viewService.exportCustomerCardsToCSV(customerName, savingName, isReportLoss,
                startDate, endDate, minBalance, maxBalance);
        if (result.isSuccess()) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=customer-cards-view.csv")
                    .contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
                    .body(result.getData());
        } else {
            return ResponseEntity.badRequest().body("导出失败：" + result.getMessage());
        }
    }

    /**
     * 交易明细视图查询页面
     *
     * @param model 模型
     * @return 交易明细视图页面
     */
    @GetMapping("/views/trade-details")
    public String tradeDetailsView(Model model) {
        return "admin/views/trade-details";
    }

    /**
     * 分页查询交易明细视图数据
     *
     * @param current 当前页
     * @param size 页大小
     * @param cardId 卡号（可选）
     * @param customerName 客户姓名（可选）
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return 分页结果
     */
    @GetMapping("/views/trade-details/page")
    @ResponseBody
    public Result<IPage<TradeDetailView>> getTradeDetailsViewPage(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size,
            @RequestParam(required = false) String cardId,
            @RequestParam(required = false) String customerName,
            @RequestParam(required = false) String tradeType,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime,
            @RequestParam(required = false) BigDecimal minAmount,
            @RequestParam(required = false) BigDecimal maxAmount) {

        Page<TradeDetailView> page = new Page<>(current, size);
        return viewService.getTradeDetailsPage(page, cardId, customerName, tradeType,
                startTime, endTime, minAmount, maxAmount);
    }

    /**
     * 导出交易明细视图数据到CSV
     *
     * @param cardId 卡号（可选）
     * @param customerName 客户姓名（可选）
     * @param tradeType 交易类型（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return CSV文件
     */
    @GetMapping("/views/trade-details/export")
    public ResponseEntity<String> exportTradeDetailsView(
            @RequestParam(required = false) String cardId,
            @RequestParam(required = false) String customerName,
            @RequestParam(required = false) String tradeType,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime startTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm") LocalDateTime endTime,
            @RequestParam(required = false) BigDecimal minAmount,
            @RequestParam(required = false) BigDecimal maxAmount) {

        Result<String> result = viewService.exportTradeDetailsToCSV(cardId, customerName, tradeType,
                startTime, endTime, minAmount, maxAmount);
        if (result.isSuccess()) {
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=trade-details-view.csv")
                    .contentType(MediaType.parseMediaType("text/csv; charset=UTF-8"))
                    .body(result.getData());
        } else {
            return ResponseEntity.badRequest().body("导出失败：" + result.getMessage());
        }
    }
}
